#include <iostream>
#include <fstream>
#include <unordered_map>
#include <string>

using ConfigMap = std::unordered_map<std::string, std::string>;

// 从配置文件中读取配置项到unordered_map中
void readConfig(const std::string& filename, std::unordered_map<std::string, std::string>& configMap) {
    std::ifstream file(filename);
    std::string line;
    
    while (std::getline(file, line)) {
        // 查找|和=的位置
        size_t pos_pipe = line.find('|');
        size_t pos_eq = line.find('=');
        
        // 找到第一个出现的分隔符
        size_t pos = std::string::npos;
        if (pos_pipe != std::string::npos && pos_eq != std::string::npos) {
            // 两个符号都存在，取位置靠前的
            pos = std::min(pos_pipe, pos_eq);
        } else if (pos_pipe != std::string::npos) {
            // 只有|存在
            pos = pos_pipe;
        } else if (pos_eq != std::string::npos) {
            // 只有=存在
            pos = pos_eq;
        }
        
        // 如果找到分隔符，则分割并存入map
        if (pos != std::string::npos) {
            std::string key = line.substr(0, pos);
            std::string value = line.substr(pos + 1);
            configMap[key] = value;
        }
    }
    
    // ifstream会在析构时自动关闭，file.close()可以省略
}

// 对比两个配置文件的不同并输出
void compareConfigsFiles(const std::unordered_map<std::string, std::string>& config1,
                    const std::unordered_map<std::string, std::string>& config2,ConfigMap &SourceExistDestinationNoExist,ConfigMap &SourceNoExistDestinationExist) {
    // 检查config1中有而config2中没有的配置项
    for (const auto& item : config1) {
        if (config2.find(item.first) == config2.end()) {
            SourceExistDestinationNoExist[item.first]=item.second;
        }
    }

    // 检查config2中有而config1中没有的配置项
    for (const auto& item : config2) {
        if (config1.find(item.first) == config1.end()) {
            SourceNoExistDestinationExist[item.first]=item.second;
        }
    }

    // 检查两个配置文件中键相同但值不同的配置项
    for (const auto& item : config1) {
        auto it = config2.find(item.first);
        if (it != config2.end() && it->second != item.second) {
            std::cout << "键相同但值不同: " << item.first << " \n在第一个配置文件中值为 " << item.second
                      << "\n在第二个配置文件中值为 " << it->second << std::endl;
        }
    }
}

int readFiles(const std::string& source,const std::string& dest) {
    std::unordered_map<std::string, std::string> config1;
    std::unordered_map<std::string, std::string> config2;
    std::unordered_map<std::string, std::string> SourceExistDestinationNoExist;
    std::unordered_map<std::string, std::string> SourceNoExistDestinationExist;
    readConfig(source, config1);
    readConfig(dest, config2);
    compareConfigsFiles(config1, config2,SourceExistDestinationNoExist,SourceNoExistDestinationExist);
    // 输出配置
    std::cout << "在第一个配置文件中存在，第二个配置文件中不存在: " << std::endl;
    for (const auto &pair : SourceExistDestinationNoExist)
    {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    std::cout << "在第二个配置文件中存在，第一个配置文件中不存在: " << std::endl;
    for (const auto &pair : SourceNoExistDestinationExist)
    {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
    return 0;
}